# 普通递归，可能会栈溢出
def fact(n):
    if n==1:
        return 1
    else:
        return n * fact(n-1)
fact(10)

# 尾递归
# 尾递归是指，在函数返回的时候，调用自身本身，并且，return语句不能包含表达式
def fact_iter(num, product):
    if num == 1:
        return product
    return fact_iter(num - 1, num * product)
fact_iter(10, 1)

# 练习
'''
汉诺塔的移动可以用递归函数非常简单地实现。
请编写move(n, a, b, c)函数，它接收参数n，表示3个柱子A、B、C中第1个柱子A的盘子数量，然后打印出把所有盘子从A借助B移动到C的方法，例如：
# 期待输出:
# A --> C
# A --> B
# C --> B
# A --> C
# B --> A
# B --> C
# A --> C
move(3, 'A', 'B', 'C')
'''
def move(n, a, b, c):
    if n == 1:
        print(a, '-->', c)
    else:
        move(n-1,a,c,b) 
        move(1,a,b,c)
        move(n-1,b,a,c)